home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / util / moni / Scout-src.lha / netinclude / rpcsvc / rstat_proc.c < prev    next >
C/C++ Source or Header  |  2002-09-16  |  8KB  |  325 lines

  1. /* @(#)rstat_proc.c    2.2 88/08/01 4.0 RPCSRC */
  2. #ifndef lint
  3. static  char sccsid[] = "@(#)rpc.rstatd.c 1.1 86/09/25 Copyr 1984 Sun Micro";
  4. #endif
  5.  
  6. /*
  7.  * Copyright (c) 1984 by Sun Microsystems, Inc.
  8.  */
  9.  
  10.  
  11. /*
  12.  * rstat service:  built with rstat.x and derived from rpc.rstatd.c
  13.  */
  14.  
  15. #include <signal.h>
  16. #include <stdio.h>
  17. #include <rpc/rpc.h>
  18. #include <sys/socket.h>
  19. #include <nlist.h>
  20. #include <sys/dk.h>
  21. #include <sys/errno.h>
  22. #include <sys/vmmeter.h>
  23. #include <net/if.h>
  24. #include "rstat.h"
  25.  
  26. struct nlist nl[] = {
  27. #define    X_CPTIME    0
  28.     { "_cp_time" },
  29. #define    X_SUM        1
  30.     { "_sum" },
  31. #define    X_IFNET        2
  32.     { "_ifnet" },
  33. #define    X_DKXFER    3
  34.     { "_dk_xfer" },
  35. #define    X_BOOTTIME    4
  36.     { "_boottime" },
  37. #define    X_AVENRUN    5
  38.     { "_avenrun" },
  39. #define X_HZ        6
  40.     { "_hz" },
  41.     "",
  42. };
  43. int kmem;
  44. int firstifnet, numintfs;    /* chain of ethernet interfaces */
  45. int stats_service();
  46.  
  47. /*
  48.  *  Define EXIT_WHEN_IDLE if you are able to have this program invoked
  49.  *  automatically on demand (as from inetd).  When defined, the service
  50.  *  will terminated after being idle for 20 seconds.
  51.  */
  52. int sincelastreq = 0;        /* number of alarms since last request */
  53. #ifdef EXIT_WHEN_IDLE
  54. #define CLOSEDOWN 20        /* how long to wait before exiting */
  55. #endif /* def EXIT_WHEN_IDLE */
  56.  
  57. union {
  58.     struct stats s1;
  59.     struct statsswtch s2;
  60.     struct statstime s3;
  61. } stats_all;
  62.  
  63. int updatestat();
  64. static stat_is_init = 0;
  65. extern int errno;
  66.  
  67. #ifndef FSCALE
  68. #define FSCALE (1 << 8)
  69. #endif
  70.  
  71. stat_init()
  72. {
  73.     stat_is_init = 1;
  74.     setup();
  75.     updatestat();
  76.     alarm(1);
  77.     signal(SIGALRM, updatestat);
  78.     sleep(1);               /* allow for one wake-up */
  79. }
  80.  
  81. statstime *
  82. rstatproc_stats_3()
  83. {
  84.     if (! stat_is_init)
  85.         stat_init();
  86.     sincelastreq = 0;
  87.     return(&stats_all.s3);
  88. }
  89.  
  90. statsswtch *
  91. rstatproc_stats_2()
  92. {
  93.     if (! stat_is_init)
  94.         stat_init();
  95.     sincelastreq = 0;
  96.     return(&stats_all.s2);
  97. }
  98.  
  99. stats *
  100. rstatproc_stats_1()
  101. {
  102.     if (! stat_is_init)
  103.         stat_init();
  104.     sincelastreq = 0;
  105.     return(&stats_all.s1);
  106. }
  107.  
  108. u_int *
  109. rstatproc_havedisk_3()
  110. {
  111.     static u_int have;
  112.  
  113.     if (! stat_is_init)
  114.         stat_init();
  115.     sincelastreq = 0;
  116.     have = havedisk();
  117.     return(&have);
  118. }
  119.  
  120. u_int *
  121. rstatproc_havedisk_2()
  122. {
  123.     return(rstatproc_havedisk_3());
  124. }
  125.  
  126. u_int *
  127. rstatproc_havedisk_1()
  128. {
  129.     return(rstatproc_havedisk_3());
  130. }
  131.  
  132. updatestat()
  133. {
  134.     int off, i, hz;
  135.     struct vmmeter sum;
  136.     struct ifnet ifnet;
  137.     double avrun[3];
  138.     struct timeval tm, btm;
  139.  
  140. #ifdef DEBUG
  141.     fprintf(stderr, "entering updatestat\n");
  142. #endif
  143. #ifdef EXIT_WHEN_IDLE
  144.     if (sincelastreq >= CLOSEDOWN) {
  145. #ifdef DEBUG
  146.     fprintf(stderr, "about to closedown\n");
  147. #endif
  148.         exit(0);
  149.     }
  150.     sincelastreq++;
  151. #endif /* def EXIT_WHEN_IDLE */
  152.     if (lseek(kmem, (long)nl[X_HZ].n_value, 0) == -1) {
  153.         fprintf(stderr, "rstat: can't seek in kmem\n");
  154.         exit(1);
  155.     }
  156.     if (read(kmem, (char *)&hz, sizeof hz) != sizeof hz) {
  157.         fprintf(stderr, "rstat: can't read hz from kmem\n");
  158.         exit(1);
  159.     }
  160.     if (lseek(kmem, (long)nl[X_CPTIME].n_value, 0) == -1) {
  161.         fprintf(stderr, "rstat: can't seek in kmem\n");
  162.         exit(1);
  163.     }
  164.      if (read(kmem, (char *)stats_all.s1.cp_time, sizeof (stats_all.s1.cp_time))
  165.         != sizeof (stats_all.s1.cp_time)) {
  166.         fprintf(stderr, "rstat: can't read cp_time from kmem\n");
  167.         exit(1);
  168.     }
  169.     if (lseek(kmem, (long)nl[X_AVENRUN].n_value, 0) ==-1) {
  170.         fprintf(stderr, "rstat: can't seek in kmem\n");
  171.         exit(1);
  172.     }
  173. #ifdef vax
  174.      if (read(kmem, (char *)avrun, sizeof (avrun)) != sizeof (avrun)) {
  175.         fprintf(stderr, "rstat: can't read avenrun from kmem\n");
  176.         exit(1);
  177.     }
  178.     stats_all.s2.avenrun[0] = avrun[0] * FSCALE;
  179.     stats_all.s2.avenrun[1] = avrun[1] * FSCALE;
  180.     stats_all.s2.avenrun[2] = avrun[2] * FSCALE;
  181. #endif
  182.     if (lseek(kmem, (long)nl[X_BOOTTIME].n_value, 0) == -1) {
  183.         fprintf(stderr, "rstat: can't seek in kmem\n");
  184.         exit(1);
  185.     }
  186.      if (read(kmem, (char *)&btm, sizeof (stats_all.s2.boottime))
  187.         != sizeof (stats_all.s2.boottime)) {
  188.         fprintf(stderr, "rstat: can't read boottime from kmem\n");
  189.         exit(1);
  190.     }
  191.     stats_all.s2.boottime.tv_sec = btm.tv_sec;
  192.     stats_all.s2.boottime.tv_usec = btm.tv_usec;
  193.  
  194.  
  195. #ifdef DEBUG
  196.     fprintf(stderr, "%d %d %d %d\n", stats_all.s1.cp_time[0],
  197.         stats_all.s1.cp_time[1], stats_all.s1.cp_time[2], stats_all.s1.cp_time[3]);
  198. #endif
  199.  
  200.     if (lseek(kmem, (long)nl[X_SUM].n_value, 0) ==-1) {
  201.         fprintf(stderr, "rstat: can't seek in kmem\n");
  202.         exit(1);
  203.     }
  204.      if (read(kmem, (char *)&sum, sizeof sum) != sizeof sum) {
  205.         fprintf(stderr, "rstat: can't read sum from kmem\n");
  206.         exit(1);
  207.     }
  208.     stats_all.s1.v_pgpgin = sum.v_pgpgin;
  209.     stats_all.s1.v_pgpgout = sum.v_pgpgout;
  210.     stats_all.s1.v_pswpin = sum.v_pswpin;
  211.     stats_all.s1.v_pswpout = sum.v_pswpout;
  212.     stats_all.s1.v_intr = sum.v_intr;
  213.     gettimeofday(&tm, (struct timezone *) 0);
  214.     stats_all.s1.v_intr -= hz*(tm.tv_sec - btm.tv_sec) +
  215.         hz*(tm.tv_usec - btm.tv_usec)/1000000;
  216.     stats_all.s2.v_swtch = sum.v_swtch;
  217.  
  218.     if (lseek(kmem, (long)nl[X_DKXFER].n_value, 0) == -1) {
  219.         fprintf(stderr, "rstat: can't seek in kmem\n");
  220.         exit(1);
  221.     }
  222.      if (read(kmem, (char *)stats_all.s1.dk_xfer, sizeof (stats_all.s1.dk_xfer))
  223.         != sizeof (stats_all.s1.dk_xfer)) {
  224.         fprintf(stderr, "rstat: can't read dk_xfer from kmem\n");
  225.         exit(1);
  226.     }
  227.  
  228.     stats_all.s1.if_ipackets = 0;
  229.     stats_all.s1.if_opackets = 0;
  230.     stats_all.s1.if_ierrors = 0;
  231.     stats_all.s1.if_oerrors = 0;
  232.     stats_all.s1.if_collisions = 0;
  233.     for (off = firstifnet, i = 0; off && i < numintfs; i++) {
  234.         if (lseek(kmem, (long)off, 0) == -1) {
  235.             fprintf(stderr, "rstat: can't seek in kmem\n");
  236.             exit(1);
  237.         }
  238.         if (read(kmem, (char *)&ifnet, sizeof ifnet) != sizeof ifnet) {
  239.             fprintf(stderr, "rstat: can't read ifnet from kmem\n");
  240.             exit(1);
  241.         }
  242.         stats_all.s1.if_ipackets += ifnet.if_ipackets;
  243.         stats_all.s1.if_opackets += ifnet.if_opackets;
  244.         stats_all.s1.if_ierrors += ifnet.if_ierrors;
  245.         stats_all.s1.if_oerrors += ifnet.if_oerrors;
  246.         stats_all.s1.if_collisions += ifnet.if_collisions;
  247.         off = (int) ifnet.if_next;
  248.     }
  249.     gettimeofday((struct timeval *)&stats_all.s3.curtime,
  250.         (struct timezone *) 0);
  251.     alarm(1);
  252. }
  253.  
  254. static 
  255. setup()
  256. {
  257.     struct ifnet ifnet;
  258.     int off;
  259.  
  260.     nlist("/vmunix", nl);
  261.     if (nl[0].n_value == 0) {
  262.         fprintf(stderr, "rstat: Variables missing from namelist\n");
  263.         exit (1);
  264.     }
  265.     if ((kmem = open("/dev/kmem", 0)) < 0) {
  266.         fprintf(stderr, "rstat: can't open kmem\n");
  267.         exit(1);
  268.     }
  269.  
  270.     off = nl[X_IFNET].n_value;
  271.     if (lseek(kmem, (long)off, 0) == -1) {
  272.         fprintf(stderr, "rstat: can't seek in kmem\n");
  273.         exit(1);
  274.     }
  275.     if (read(kmem, (char *)&firstifnet, sizeof(int)) != sizeof (int)) {
  276.         fprintf(stderr, "rstat: can't read firstifnet from kmem\n");
  277.         exit(1);
  278.     }
  279.     numintfs = 0;
  280.     for (off = firstifnet; off;) {
  281.         if (lseek(kmem, (long)off, 0) == -1) {
  282.             fprintf(stderr, "rstat: can't seek in kmem\n");
  283.             exit(1);
  284.         }
  285.         if (read(kmem, (char *)&ifnet, sizeof ifnet) != sizeof ifnet) {
  286.             fprintf(stderr, "rstat: can't read ifnet from kmem\n");
  287.             exit(1);
  288.         }
  289.         numintfs++;
  290.         off = (int) ifnet.if_next;
  291.     }
  292. }
  293.  
  294. /*
  295.  * returns true if have a disk
  296.  */
  297. static
  298. havedisk()
  299. {
  300.     int i, cnt;
  301.     long  xfer[DK_NDRIVE];
  302.  
  303.     nlist("/vmunix", nl);
  304.     if (nl[X_DKXFER].n_value == 0) {
  305.         fprintf(stderr, "rstat: Variables missing from namelist\n");
  306.         exit (1);
  307.     }
  308.     if ((kmem = open("/dev/kmem", 0)) < 0) {
  309.         fprintf(stderr, "rstat: can't open kmem\n");
  310.         exit(1);
  311.     }
  312.     if (lseek(kmem, (long)nl[X_DKXFER].n_value, 0) == -1) {
  313.         fprintf(stderr, "rstat: can't seek in kmem\n");
  314.         exit(1);
  315.     }
  316.     if (read(kmem, (char *)xfer, sizeof xfer)!= sizeof xfer) {
  317.         fprintf(stderr, "rstat: can't read kmem\n");
  318.         exit(1);
  319.     }
  320.     cnt = 0;
  321.     for (i=0; i < DK_NDRIVE; i++)
  322.         cnt += xfer[i];
  323.     return (cnt != 0);
  324. }
  325.